package com.example.demo.controller

import jakarta.servlet.http.HttpServletResponse
import org.springframework.http.ResponseEntity
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.reactive.function.client.WebClient
import org.springframework.web.servlet.ModelAndView
import org.springframework.web.servlet.view.RedirectView
import reactor.core.publisher.Mono

@Controller
@RequestMapping('/api')
class RedirectController {
    String redirectUrl = 'https://www.baidu.com'

    @GetMapping('/redirect1')
    RedirectView redirect1() {
        // RedirectView 是 SpringMVC 提供的一个视图类，用于执行重定向操作
        return new RedirectView(redirectUrl)
    }

    @RequestMapping('/redirect2')
    String redirect2() {
        // 在 SpringMVC 中，返回一个以 redirect: 开头的字符串可以实现重定向
        return "redirect:$redirectUrl"
    }

    @GetMapping('/redirect3')
    void redirect3(HttpServletResponse response) {
        // 通过操作 HttpServletResponse 对象，可以手动设置响应头实现重定向
        response.sendRedirect(redirectUrl)
    }

    @GetMapping('/redirect4')
    ResponseEntity<String> redirect4() {
        // ResponseEntity 提供了一种灵活的方式来构建 HTTP 响应，包括状态码和响应头
        return ResponseEntity.status(302)
                .header('Location', redirectUrl)
                .build()
    }

    @GetMapping('/redirect5')
    Mono<String> redirect5() {
        // 如果你需要在后端进行异步请求并重定向，可以使用 WebClient 或 RestTemplate
        return WebClient.create(redirectUrl)
                .get()
                .retrieve()
                .bodyToMono(String.class)
                .map { "redirect:$redirectUrl" }
    }

    @GetMapping('/redirect6')
    ModelAndView redirect6() {
        // ModelAndView 可以同时设置模型数据和视图，也可以用于重定向
        return new ModelAndView("redirect:$redirectUrl")
    }
}
